盒子
盒子
文章目录
  1. 什么是Kubernetes
  2. 核心概念
    1. 网络预置
  3. 设计原则
    1. 声明式编程(Declarative)
    2. Level-triggered
  4. Pod
    1. 基本概念
    2. pod 的五大状态(生命周期,pod phase)
    3. pod 的重启策略
  5. API
    1. API 资源结构
    2. API 扩展方法
  6. RC, RS, Deployment
    1. RC
    2. RS
    3. Deployment
  7. PV, PVC

Kubernetes 学习笔记

什么是Kubernetes

Kubernetes 是 Google 开源的基于容器技术的分布式架构领先方案,提供应用部署、维护、扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用。

单容器( contianer )所遇到的问题

  • 需要被管理
  • 网络环境复杂
  • 容器需要被调度、分发,以及配置负载均衡
  • 数据需要被保存在其他地方

  • 使用 Docker 对应用程序打包、实例化、运行
  • 以集群的方式运行、管理跨机器的容器
  • 解决 Docker 跨机器容器之间的通讯问题

核心概念

分为 master 和 node 节点,master 为集群控制节点
master 节点通常会占据一个独立的服务器(高可用部署建议使用三台服务器(如果 master 和 etcd 部在一起的话))

master上:etcd, controller, scheduler, api server

  • etcd: key-value 存储,集群状态管理,是运行在多节点上的分布式键值存储,高可用(奇数个,必须半数以上的选举,容错能力限制于节点数的一半,选举 raft)
  • controller:控制器(多个控制器组成)选举
  • scheduler:调度器,负责资源调度(pod 调度)的进程 选举。scheduler 的职责很明确,就是负责调度 pod 到合适的 Node 上。如果把 scheduler 看成一个黑匣子,那么它的输入是 pod 和由多个 Node 组成的列表,输出是 Pod 和一个 Node 的绑定,即将这个 pod 部署到这个 Node 上。Kubernetes 目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
  • api server:暴露接口,处理请求。提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。APIServer负责对外提供RESTful的 Kubernetes API 服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给 APIServer 处理后再提交给 etcd,kubectl( Kubernetes 提供的客户端工具,该工具内部就是对 Kubernetes API 的调用)是直接和 APIServer 交互的。

node上:kubelet, kubeproxy, runtime

  • kubelet:管理 pod,负责 pod 对应的容器的创建、启停等任务,同时与 master 节点密切协作,实现集群管理的基本功能
  • kubeproxy: 实现 kubernetes service 的通信与负载均衡机制的重要组件
  • runtime: runtime 指的是容器运行环境,目前 Kubernetes 支持 docker 和 rkt 两种容器。

除了核心组件,还有一些推荐的 Add-ons:

  • kube-dns:负责为整个集群提供 DNS 服务
  • Ingress Controller:为服务提供外网入口
  • Heapster:提供资源监控
  • Dashboard:提供GUI
  • Federation:提供跨可用区的集群
  • Fluentd-elasticsearch:提供集群日志采集、存储与查询

网络预置

  • 所有 pods 之间可以相互通信
  • 所有 pods 和 nodes 可以相互通信
  • 不做 NAT

设计原则

声明式编程(Declarative)

声明式与命令式的区别

Declarative 的定义是用户设定期望的状态,系统会知道它需要执行什么操作,来达到期望的状态。
而对于 Imperative,需要用户告诉系统需要做什么。比如说用户说创建一个新的 Container,系统才会创建一个新的 Container。

Level-triggered

Pod

基本概念

  • Kubernetes 中最小计算和被调度单元
  • 是多个容器的集合,pod 中的容器共享 namespacevolume
  • 一 pod 一 ip

pod 的五大状态(生命周期,pod phase)

  • Pending:系统已经接受 pod 实例的创建,但其中所包含容器的一个或者多个 image 还没有创建成功。Pending 包含调度计算与通过网络创建 image,所以此 phase 的时间可能会有点长。
  • Running:Pod 已经被调度到某个 node 上,pod 包含的所有容器已经创建完成,至少有一个容器正常运行或者处于启动与重启动过程。
  • Failed:Pod 中所有容器已终止运行,至少有一个容器非正常结束,比如退出码非零,被系统强制杀死等。
  • Succeeded:Pod 中的所有容器正常终止,并且不会再次启动。
  • Unknown:无法取得 pod 状态,一般是网络问题引起。

pod 的重启策略

  • Always:总是重启
  • Never:从不重启
  • OnFailure:失败时重启

API

API 资源结构

  • apiVersion:api 版本
  • kind:资源类型
  • metadata:元数据
  • spec:Spec 是让用户写入期望的状态,系统可以通过 Spec 读出用户的期望
  • status:Status 是系统写入观察到的状态,用户可以从中读出系统当前是什么状态

API 扩展方法

  • CRD:自定义 api
  • aggregator:让用户利用全部的 Kubernetes API 实现自己的 apiserver,封装服务层

RC, RS, Deployment

RC

推荐使用 RS + Deployment 来代替 RC
是比 pod 高一级的存在
RC 与 Pod 的关联是通过 Label 来实现的(通过 selector)
Label 是键值对,可用于筛选资源

RS

大部分与 RC 相同,除了 rolling update (RS 特有)

Deployment

比 RS 高一级的定义微服务应用的抽象层
Deployments 创建 RS

PV, PVC

PV 与 PVC 一一对应
管理员定义 PV, 用户使用 PVC